package com.markerhub.controller;

import com.markerhub.common.lang.Result;
import com.markerhub.entity.SysConfig;
import com.markerhub.service.SysConfigService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Date;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

/**
 * 系统配置Controller
 */
@Api(tags = "系统配置管理")
@RestController
@RequestMapping("/api/sys-config")
public class SysConfigController extends BaseController {

    @Autowired
    private SysConfigService sysConfigService;

    /**
     * 获取系统配置列表
     */
    @PreAuthorize("hasAuthority('sys:config:list')")
    @ApiOperation(value = "获取配置列表", notes = "获取所有系统配置信息，支持分页查询")
    @GetMapping("/list")
    public Result list(@RequestParam(required = false) String configKey, @RequestParam(required = false) String configName) {
        // 使用BaseController中的getPage()方法获取分页参数
        Page<SysConfig> page = getPage();
        // 构建查询条件
        QueryWrapper<SysConfig> wrapper = new QueryWrapper<>();
        if (configKey != null && !configKey.isEmpty()) {
            wrapper.like("config_key", configKey);
        }
        if (configName != null && !configName.isEmpty()) {
            wrapper.like("config_name", configName);
        }
        // 按创建时间倒序排序
        wrapper.orderByDesc("created");
        // 执行分页查询
        Page<SysConfig> pageData = sysConfigService.page(page, wrapper);
        return Result.succ(200, "获取系统参数配置列表成功", pageData);
    }

    /**
     * 查询系统配置
     */
    @PreAuthorize("hasAuthority('sys:config:list')")
    @ApiOperation(value = "查询系统配置", notes = "根据条件查询系统配置")
    @GetMapping("/query")
    public Result query(@RequestParam(required = false) String configKey, 
                       @RequestParam(required = false) String configName) {
        // 复用list方法的查询逻辑
        return list(configKey, configName);
    }

    /**
     * 根据ID获取系统参数配置信息
     */
    @PreAuthorize("hasAuthority('sys:config:list')")
    @ApiOperation(value = "获取配置详情", notes = "根据ID获取系统配置详细信息")
    @GetMapping("/detail/{id}")
    public Result detail(@PathVariable Long id) {
        SysConfig config = sysConfigService.getById(id);
        return Result.succ(200, "获取系统参数配置信息成功", config);
    }
    
    /**
     * 根据键获取配置值
     */
    @ApiOperation(value = "根据键获取配置值", notes = "根据配置键获取对应的配置值")
    @GetMapping("/get/{key}")
    public Result getConfigByKey(@PathVariable String key) {
        SysConfig config = sysConfigService.lambdaQuery()
                .eq(SysConfig::getConfig_key, key)
                .one();
        return config != null ? Result.succ(200, "获取配置值成功", config.getConfig_value()) : Result.fail("配置不存在");
    }

    /**
     * 创建系统参数配置
     */
    @PreAuthorize("hasAuthority('sys:config:add')")
    @ApiOperation(value = "创建系统配置", notes = "新增系统配置信息")
    @PostMapping("/add")
    public Result add(@RequestBody SysConfig config) {
        // 设置创建时间
        config.setCreated(new Date());
        // 设置更新时间
        config.setUpdated(new Date());
        boolean saved = sysConfigService.save(config);
        return saved ? Result.succ(200, "创建系统参数配置成功", null) : Result.fail("创建系统参数配置失败");
    }

    /**
     * 更新系统参数配置
     */
    @PreAuthorize("hasAuthority('sys:config:update')")
    @ApiOperation(value = "更新系统配置", notes = "更新系统配置信息")
    @PutMapping("/update")
    public Result update(@RequestBody SysConfig config) {
        // 设置更新时间
        config.setUpdated(new Date());
        boolean updated = sysConfigService.updateById(config);
        return updated ? Result.succ(200, "更新系统参数配置成功", null) : Result.fail("更新系统参数配置失败");
    }

    /**
     * 删除系统参数配置（单个）
     */
    @PreAuthorize("hasAuthority('sys:config:delete')")
    @ApiOperation(value = "删除系统配置", notes = "根据ID删除单个系统配置")
    @DeleteMapping("/delete/{id}")
    public Result delete(@PathVariable Long id) {
        boolean deleted = sysConfigService.removeById(id);
        return deleted ? Result.succ(200, "删除系统参数配置成功", null) : Result.fail("删除系统参数配置失败");
    }
    

}